/*
 * 文件名：BatteryMonitor.cpp
 * 功能描述：电池监控和电量管理
 */

#include "BatteryMonitor.h"
#include <Arduino.h>
#include "config.h"

float lastFilteredVoltage = 0.0;
int displayedPercentage = 100;
int lastStablePercentage = 100;
bool isCharging = false;       // 充电检测
float lastFilteredValue = 0.0; // 上一次的滤波值

void BatteryStatus_init()
{
    pinMode(17, INPUT);       // 假设充电状态引脚是17
    pinMode(ADC_PIN, INPUT);  // 假设充电状态引脚是17
    analogReadResolution(12); // 设置ADC分辨率为12位
}
// 电池电量百分比计算函数
float getBatteryPercentage(float voltage)
{
    if (voltage >= 12.6)
        return 100.0;
    else if (voltage >= 12.3)
        return map(voltage, 12.3, 12.6, 95.0, 100.0);
    else if (voltage >= 12.0)
        return map(voltage, 12.0, 12.3, 80.0, 95.0);
    else if (voltage >= 11.7)
        return map(voltage, 11.7, 12.0, 60.0, 80.0);
    else if (voltage >= 11.4)
        return map(voltage, 11.4, 11.7, 40.0, 60.0);
    else if (voltage >= 11.1)
        return map(voltage, 11.1, 11.4, 20.0, 40.0);
    else if (voltage >= 10.8)
        return map(voltage, 10.8, 11.1, 5.0, 20.0);
    else if (voltage >= 9.5)
        return map(voltage, 9.5, 10.8, 0.0, 5.0);
    else
        return 0.0; // 完全没电
}

// 读取电池电压并计算百分比
int readBatteryStatus()
{
    long sum = 0;

    // 读取多次ADC值并求平均
    for (int i = 0; i < NUM_SAMPLES; i++)
    {
        sum += analogRead(ADC_PIN); // 累加读取的ADC值
        delay(5);                   // 每次读取后稍微延时，避免频繁采样
    }

    // 计算平均值
    int rawValue = sum / NUM_SAMPLES;

    // 将ADC值转换为电压（0-3.3V）
    float voltage = (rawValue / 4095.0) * 3.3;

    // 分压校正（假设R1=150k，R2=51k），分压比3.94倍
    float inputVoltage = voltage * 3.94; // 电池电压放大约 3.94 倍

    // 计算电池容量百分比
    int percentage = (inputVoltage - 9.5) / (12.1 - 9.5) * 100.0;
    percentage = constrain(percentage, 0, 100); // 限制在0-100%
    //读取数字引脚10​​的当前状态，高电平返回ture，低电平false
    isCharging = (digitalRead(10) == 1);
    // 读取充电状态
    Charging_status = isCharging; // 高电平表示正在充电

    // 现在屏幕上的电池电量显示是会跳的，因为每次读取的电压值不同，导致计算出的电量百分比不同。
    // 以下代码是为了让电量显示更稳定，即减少电量显示的跳变,但是其实现逻辑会导致电量显示不正确。
    //  // 充放电逻辑
    //  if (!isCharging)
    //  {
    //      percentage = min(percentage, lastStablePercentage);
    //      lastStablePercentage = percentage;
    //  }
    //  else
    //  {
    //      lastStablePercentage = max(percentage, lastStablePercentage); // 确保电量只增加
    //      percentage = lastStablePercentage;                            // 在充电时强制使用最新的最大值
    //  }

    // 应用滞回
    // if (abs(percentage - displayedPercentage) >= HYSTERESIS)
    // {
    //     displayedPercentage = percentage;
    // }

    // // 打印结果
    // Serial.print("Raw ADC: ");
    // Serial.print(rawValue);
    // Serial.print(" - Voltage: ");
    // Serial.print(voltage, 3); // 输出电压，保留3位小数
    // Serial.print("V - Battery: ");
    // Serial.print(percentage, 0); // 输出剩余电量百分比，保留1位小数
    // Serial.println("%");
    
    //返回电池容量
    batteryLevel_g = percentage;

    return percentage;
}
